﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using FinanSoft.Entities;
using System.Web.Services;

namespace PoSWebService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class PointOfSaleService : IPointOfSaleServiceContract
    {
        #region Atributos
        private bool _IsError;
        private string _ErrorMessage;
        #endregion

        /// <summary>
        /// Método que se encaga de revisar si hubo error o no
        /// </summary>
        /// <returns>Retorna un booleano de si hubo error o no</returns>
        public bool IsError()
        {
            return this._IsError;
        }

        /// <summary>
        /// Método que se encaga de obtener el mensaje de error
        /// </summary>
        /// <returns>Retorna el mensaje de error</returns>
        public string GetErrorMessage()
        {
            return this._ErrorMessage;
        }
        /// <summary>
        /// Método que se encarga de llamar al sistema para poder autenticar al
        /// cajero que está ingresando al sistema
        /// </summary>
        /// <param name="username">Nombre de usuario del cajero</param>
        /// <param name="password">Contraseña del cajero</param>
        /// <returns>Indica si la autenticación fue exitosa o no</returns>
        [WebMethod(EnableSession = true)] 
        public bool LogInCashier(string username, string password, string company)
        {
            return FinanSoft.BusinessLayer.WebServiceController.GetInstance().LogInSalesman(username, password, company, OperationContext.Current.SessionId);
        }

        /// <summary>
        /// Obtiene las sucursales
        /// </summary>
        /// <returns></returns>
        public FinanSoft.Entities.AuxiliarAccount[] GetBranches()
        {
            FinanSoft.Entities.AuxiliarAccount[] clientAccounts = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetClients(OperationContext.Current.SessionId);
            if (clientAccounts == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return clientAccounts;
        }

        /// <summary>
        /// Método que se encarga de obtener las bodegas registradas en el sistema
        /// </summary>
        /// <returns>Retorna la lista de objetos bodega</returns>
        public List<FinanSoft.Entities.StoreRoom> GetStoreRooms()
        {
            List<FinanSoft.Entities.StoreRoom> storeRooms = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetStoreRooms(OperationContext.Current.SessionId);
            if (storeRooms == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return storeRooms;
        }

        /// <summary>
        /// Método que se encarga de obtener todos los artículos que hay en el sistema
        /// además de su información: bodega en donde está, el stock disponible, etc...
        /// </summary>
        /// <returns></returns>
        public List<FinanSoft.Entities.Item> GetItems()
        {
            List<FinanSoft.Entities.Item> items = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetItems(OperationContext.Current.SessionId);
            if (items == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return items;
        }

        /// <summary>
        /// Método que se encarga de guardar la factura cliente y hacer el pago de la misma
        /// </summary>
        /// <param name="doc">La factura cliente generada previamente para ser revisada por el método PreviewInvoiceDocument</param>
        /// <returns></returns>
        public bool SaveClienInvoiceDocument(Document doc)
        {
            bool noErrror = FinanSoft.BusinessLayer.WebServiceController.GetInstance().SaveClienInvoiceDocument(doc, OperationContext.Current.SessionId);
            if (!noErrror)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            
            return noErrror; 
        }

        /// <summary>
        /// Método que se encarga de crear un documento para su revision previa a su registro
        /// </summary>
        /// <param name="docType">Acrónimo del tipo de documento que és (OC, OV, EM...)</param>
        /// <param name="idAuxiliarAccount">Id de la cuenta mayor del cliente o proveedor al que está asociado</param>
        /// <param name="postingDate">Fecha de contabilización</param>
        /// <param name="deliveryExpDate">Fecha de vencimiento o de entrega</param>
        /// <param name="idMoneda">Id de la moneda en que está el documento</param>
        /// <param name="idDocBase">Id del documento base, si no tiene manda -1</param>
        /// <param name="amountBeforeTax">Monto antes de impuestos</param>
        /// <param name="taxAmount">Monto de impuestos</param>
        /// <param name="totalAmount">Monto después de impuestos</param>
        /// <returns>Retorna el documento generico creado a partir de los parametros pasados</returns>
        public Document PreviewInvoiceDocument(int idAuxiliarAccount, DateTime postingDate, DateTime deliveryExpDate, int idMoneda, double amountBeforeTax, double taxAmount, double totalAmount, List<FinanSoft.Entities.DocDetail> details)
        {
            Document doc = FinanSoft.BusinessLayer.WebServiceController.GetInstance().PreviewClienInvoiceDocument(idAuxiliarAccount, postingDate, deliveryExpDate, idMoneda, amountBeforeTax, taxAmount, totalAmount, details, OperationContext.Current.SessionId);
            if (doc == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return doc; 
        }

        /// <summary>
        /// Método que se encarga de llamar al sistema para poder autenticar al
        /// cliente que está ingresando en el sistema
        /// </summary>
        /// <param name="username">Nombre de usuario del cliente</param>
        /// <param name="password">Contraseña del cliente</param>
        /// <returns>Retorna la cuenta auxiliar asociada a ese cliente (como información)</returns>
        public FinanSoft.Entities.AuxiliarAccount LogIn(string username, string password, string company)
        {
            FinanSoft.Entities.AuxiliarAccount aux = FinanSoft.BusinessLayer.WebServiceController.GetInstance().LogIn(username, password, company, OperationContext.Current.SessionId);
            if (aux == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return aux;
        }

        /// <summary>
        /// Método que se encarga de obtener las monedas disponibles en el sistema
        /// </summary>
        /// <returns>Retorna la lista de Monedas</returns>
        public List<FinanSoft.Entities.Currency> GetCurrencies()
        {
            List<FinanSoft.Entities.Currency> currencies = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetCurrencies(OperationContext.Current.SessionId);
            if (currencies.Count == 0)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return currencies;
        }

        /// <summary>
        /// Método que se encaga de obtener el impuesto por defecto para un artículo
        /// </summary>
        /// <returns>Retorna un objeto Impuesto con su respectiva información</returns>
        public FinanSoft.Entities.Tax GetDefaultTax()
        {
            FinanSoft.Entities.Tax tax = FinanSoft.BusinessLayer.WebServiceController.GetInstance().GetDefaultTax(OperationContext.Current.SessionId);
            if (tax == null)
            {
                _IsError = true;
                _ErrorMessage = FinanSoft.BusinessLayer.WebServiceController.GetInstance().ErrorMessage;
            }
            return tax;
        }
    }
}
